/*
 * @Description: 扫描器,主要用来收集扫描过的内容
 * @Author: wangqi
 * @Date: 2021-05-04 22:24:20
 * @LastEditTime: 2021-05-08 11:10:05
 */
class Scanner {
    constructor(templateStr) {
        this.pos = 0;
        this.templateStr = templateStr;
        this.tail = templateStr;
    }

    /**
     * @description: 跳过指定的内容, 只是让pos指正递增
     * @param {String} tag  
     * @return {*}
     */
    scan(tag) {
        if (this.tail.indexOf(tag) == 0) {
            this.pos += tag.length;
            // tail 位置也需要改变为tag位置之后的内容
            this.tail = this.templateStr.substring(this.pos);
        }
    }

    /**
     * @description: 返回扫描的内容, 直到遇见 {{ 指定内容结束
     * @param  {String} stopTag      扫描的内容
     * @return {String}    返回stopTag前位置的内容
     */
    scanUtil(stopTag) {
        const pos_backup = this.pos;
        // 如果pos指针还在这个templateStr内, 且 按照指针找this.tail开头没有匹配上 stopTag则需要循环
        // this.tail.indexOf(stopTag) != 0; 说明在尾巴内还是存在{{ 的，如果等于0了,说明pos就移动到{{位置了，也就需要跳出循环了
        while (!this.eos() && this.tail.indexOf(stopTag) != 0) {
            this.pos++;
            this.tail = this.templateStr.substring(this.pos);
        }
        return this.templateStr.substring(pos_backup, this.pos);
    }

    /**
     * @description: 如果指针超出了templateStr, 这样也就该结束了
     */
    eos() {
        return this.pos >= this.templateStr.length;
    }

};

export default Scanner;


